package py.fpuna.ii.electiva2.eao;

import java.util.ArrayList;
import java.util.Iterator;
import py.fpuna.ii.electiva2.interfaces.ProveedorEAO;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import py.fpuna.ii.electiva2.dto.ProductoDTO;
import py.fpuna.ii.electiva2.dto.ProveedorDTO;
import py.fpuna.ii.electiva2.entity.Producto;
import py.fpuna.ii.electiva2.entity.Proveedor;
import py.fpuna.ii.electiva2.interfaces.ProveedorEAORemote;

/**
 *
 * @author lizg
 */
@Stateless
public class ProveedorEAOBean implements ProveedorEAO, ProveedorEAORemote {
    @PersistenceContext
    private EntityManager em;

    public String create(ProveedorDTO proveedor) {

        Proveedor entidad = null;
        String retorno = null;

        try{
            entidad = new Proveedor();
            entidad.setProvCodigo(proveedor.getProvCodigo());
            entidad.setProvDireccion(proveedor.getProvDireccion());
            entidad.setProvRazonSocial(proveedor.getProvRazonSocial());
            entidad.setProvTelefono(proveedor.getProvTelefono());
            entidad.setProductoCollection(null);

            em.persist(entidad);
            
            retorno = "OK";
        }
        catch (Exception e){
            e.printStackTrace();
            retorno = e.getMessage();
	}

	return retorno;
    }



    public void edit(ProveedorDTO proveedor) {
        Proveedor entidad = new Proveedor(proveedor.getProvCodigo(),
                proveedor.getProvRazonSocial(),
                proveedor.getProvDireccion(),
                proveedor.getProvTelefono()
        );
        Proveedor provmng = em.merge(entidad);
        em.merge(provmng);
    }



    public void remove(ProveedorDTO proveedor) {

        Proveedor entidad = new Proveedor(proveedor.getProvCodigo(),
                proveedor.getProvRazonSocial(),
                proveedor.getProvDireccion(),
                proveedor.getProvTelefono()
        );

        Proveedor provmng = em.merge(entidad);
        em.remove(provmng);
    }

    public ProveedorDTO find(Integer id) {
        ProveedorDTO retorno = null;
        Proveedor entidad = new Proveedor();
        try {
            Query q = em.createNamedQuery("Proveedor.findByProvCodigo").setParameter("provCodigo", id);
            entidad = (Proveedor)q.getSingleResult();
            retorno = new ProveedorDTO(entidad.getProvCodigo(),
                    entidad.getProvRazonSocial(),
                    entidad.getProvDireccion(),
                    entidad.getProvTelefono()
            );

            Iterator <Producto> itEntidad = entidad.getProductoCollection().iterator();
            List <ProductoDTO> prodList = new ArrayList<ProductoDTO>();

            while(itEntidad.hasNext()){
                Producto prod = itEntidad.next();
                ProductoDTO prodDto = new ProductoDTO(prod.getProdCodigo(), prod.getProdDescripcion());
                prodList.add(prodDto);
            }
            retorno.setProductoCollection(prodList);
            
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }

    public List<ProveedorDTO> findAll() {
        List<Proveedor> provList = em.createQuery("select object(o) from Proveedor as o").getResultList();

        List<ProveedorDTO> provdtoList = new ArrayList<ProveedorDTO>();

        Iterator <Proveedor> itProv = provList.iterator();

        while(itProv.hasNext()){
            Proveedor prov = itProv.next();
            ProveedorDTO provdto = new ProveedorDTO();

            provdto.setProvRazonSocial(prov.getProvRazonSocial());
            provdto.setProvDireccion(prov.getProvDireccion());
            provdto.setProvTelefono(prov.getProvTelefono());
            provdto.setProvCodigo(prov.getProvCodigo());

            provdtoList.add(provdto);
        }
        return provdtoList;
        
    }

    /**
     * busca proveedores segun un criterio
     * @param condicion
     * @return lista de proveedores q cumplen la condicion
     * @throws Exception
     */
     public List<ProveedorDTO> getListaProv(String condicion) {
        List<ProveedorDTO> retorno = null;
        List<Proveedor> provList = null; //para guardar resultado del em
        Query q = null;
        try {
            if(condicion == null || condicion.length() == 0){
                retorno = this.findAll();
            }else{
                String regexp = "%"+condicion+"%";  //busca todo lo que empiece con "condicion"
                q = em.createQuery("select p from Proveedor p WHERE lower(p.provRazonSocial) LIKE ?1 ").setParameter(1, regexp);

                // recuperamos la lista
                provList = q.getResultList();

                Iterator <Proveedor> itProv = provList.iterator();

                retorno = new ArrayList<ProveedorDTO>();

                 while(itProv.hasNext()){
                    Proveedor prov = itProv.next();
                    ProveedorDTO provdto = new ProveedorDTO();

                    provdto.setProvRazonSocial(prov.getProvRazonSocial());
                    provdto.setProvDireccion(prov.getProvDireccion());
                    provdto.setProvTelefono(prov.getProvTelefono());
                    provdto.setProvCodigo(prov.getProvCodigo());

                    retorno.add(provdto);
                }

            }
            

        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }


}
